home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-04
/
msh20.zip
/
TOOLKIT.ZIP
/
USERDEFS.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-21
|
3KB
|
117 lines
#include <string.h>
#include <stdlib.h>
#include "msh.h"
#include "primitiv.h"
/* typical actions given here as example; add your own... */
void Dup(void){Pushlong(1l);Pick();}
void Swap(void){Pushlong(2l);Roll();}
void Equal(void)
{ refobj s=Pop(),t=Pop();
if(strcmp(s->val,t->val))Pushbool(FALSE);
else Push(t);
Free(t);Free(s);
}
void Not(void){Pushbool(!Popbool());}
void Sum(void){Pushlong(Poplong()+Poplong());}
void Minus(void){long a=Poplong();Pushlong(Poplong()-a);}
void Times(void){Pushlong(Poplong()*Poplong());}
void Divide(void){long a=Poplong();
if(a==0)efns(WARNING_,"division by 0");else Pushlong(Poplong()/a);}
void Lt(void){long a=Poplong();Pushbool(Poplong()<a);}
void Le(void){long a=Poplong();Pushbool(Poplong()<=a);}
void Ge(void){long a=Poplong();Pushbool(Poplong()>=a);}
void Gt(void){long a=Poplong();Pushbool(Poplong()>a);}
void Length(void){refobj s=Pop();Pushlong(strlen(s->val));Free(s);}
void Substring(void)
{ long b=Poplong(),a=Poplong(); refobj s=Pop();
int len=strlen(s->val);
if(a<1 || b<1 || b<a || a>len || b>len)
efns(WARNING_," substring: illegal range");
else
{ char save=s->val[b];s->val[b]=0;Pushstring(s->val+a-1);s->val[b]=save;}
Free(s);
}
void Cat(void)
{refobj s=Pop(),t=Pop(),
r=(refobj)malloc(sizeof(int)+1+strlen(s->val)+strlen(t->val));
testalloc(r);
strcpy(stpcpy(r->val,t->val),s->val);r->rc=0;Push(r);
Free(t);Free(s);
}
void CutFirst(void)
{ refobj s=Pop(),t=Pop();
char *c=strstr(t->val,s->val);
if(NULL==c){Push(t);Pushbool(FALSE);}
else{char save=*c;*c=0;Pushstring(t->val);*c=save;
c+=strlen(s->val);Pushstring(c);}
Free(s);Free(t);
}
void CutLast(void)
{ refobj s=Pop(),t=Pop();
char *c=NULL,*d;
for(d=t->val;d=strstr(d,s->val);d++)c=d;
if(NULL==c){Push(t);Pushbool(FALSE);}
else{char save=*c;*c=0;Pushstring(t->val);*c=save;
c+=strlen(s->val);Pushstring(c);}
Free(s);Free(t);
}
#include <io.h>
void Unlink(void)
{ refobj s=Pop();
unlink(s->val);
Free(s);
}
#include <fcntl.h>
void Read(void)
{ refobj name=Pop();
int handle=open(name->val,O_RDONLY|O_TEXT);
if(-1==handle)efns(WARNING_|FILE_,"could not open file `%s'",name->val);
else
{ long flen=filelength(handle);
if(flen>65534u-sizeof(int))
efns(WARNING_,"file `%s' too big: %ld bytes",name->val,flen);
else
{ refobj s=(refobj)malloc(sizeof(int)+1+(unsigned)flen);
testalloc(s);s->rc=0;
if(-1==(flen=read(handle,s->val,(unsigned)flen)))
{ efns(WARNING_|FILE_,"error reading file `%s'",name->val);Free(s);}
else { s->val[flen]=0; Push(s);}
}
close(handle);
}
Free(name);
}
#include <sys/stat.h>
void Write(void)
{ refobj name=Pop(),s=Pop();
int handle=open(name->val,O_WRONLY|O_CREAT|O_APPEND|O_TEXT,S_IWRITE|S_IREAD);
if(-1==handle)efns(WARNING_|FILE_,"could not open file `%s'",name->val);
else
{ if(strlen(s->val)!=write(handle,s->val,strlen(s->val)))
efns(WARNING_|FILE_,"error writing to file `%s'",name->val);
close(handle);
}
Free(name);Free(s);
}